/**
 * @package Infinity-Seed
 *
 * @copyright Copyright (C) 2012-2013 Exia.CESI
 * @author Paul MAGNIN, Arthur MERCIER, Jordan RICHET, Cyril SCHUMACHER
 */
package infinity.seed;

import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Gestion des proprietes.
 * @author Cyril SCHUMACHER <cyril.schumacher at viacesi.fr>
 * @see <a href="http://download.oracle.com/javase/7/docs/api/java/util/Properties.html">Properties</a>
 */
public final class Configuration {
    // <editor-fold defaultstate="collapsed" desc="Attributs.">
    /**
     * Unique instance de la classe.
     */
    private static Configuration _instance;
    
    /**
     * Proprietes.
     */
    private Properties _properties;
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Méthodes.">
    // <editor-fold defaultstate="collapsed" desc="Constructeur.">
    /**
     * Constructeur.
     */
    private Configuration() {
        this._properties = new Properties();
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Récupère l'unique instance de la classe (Singleton Pattern).">
    /**
     * Récupère l'unique instance de la classe (Singleton Pattern).
     * @return Object Retourne l'instance de la classe.
     */
    public static Configuration getInstance() {
        // Vérifie si une instance existe, sinon, on l'a crée.
        if (Configuration._instance == null) {
            Configuration._instance = new Configuration();
        }
        
        return Configuration._instance;
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Définit un fichier de propriété.">
    /**
     * Définit un fichier de propriété.
     * @param filename Chemin et nom du fichier.
     * @return Boolean Retourne TRUE si le fichier à été importé, FALSE sinon.
     */
    public Boolean setConfigurationFile(String filename) {
        try {
            // Récupére le contenu d'un fichier de propriété et le charge.
            _properties.load(this.getClass().getResourceAsStream(filename));
            return true;
        }
        catch (IOException e) {
            Logger.getLogger(Configuration.class.getName()).log(Level.WARNING, null, e);
            return false;
        }
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Récupère la valeur de la clé.">
    /**
     * Récupère la valeur de la clé.
     * @param key Nom de la cle.
     * @return String Retourne la valeur selon la clé ou NULL si la clé n'existe pas.
     */
    public String get(String key) {
        // Si la clé existe, on retourne sa valeur.
        if (_properties.containsKey(key) == true) {
            return _properties.getProperty(key);
        }
        else {
            return null;
        }
    }
    // </editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Vérifie si une clé existe.">
    public Boolean exists(String key) {
        return this._properties.containsKey(key);
    }
    // </editor-fold>
    // </editor-fold>
}
